<!DOCTYPE html>
<!-- saved from url=(0131)https://docs.google.com/document/u/2/d/e/2PACX-1vT2j-XD5vxTr508IfPsJJrVS9aRTDhQE9n0Xd1vLbT2V65MzmKhRmmHM2R9ySJuGBkpMqVIS7_0i9HE/pub -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>WebPerfWG call - April 9 2020</title><link rel="shortcut icon" href="https://ssl.gstatic.com/docs/documents/images/kix-favicon7.ico"><meta name="referrer" content="strict-origin-when-cross-origin"><style type="text/css" nonce="">
      @import url("https://fonts.googleapis.com/css?family=Google+Sans");
      @import url("https://fonts.googleapis.com/css?family=Roboto");

      body {
        font-family: Roboto, arial, sans, sans-serif;
        margin: 0;
      }

      iframe {
        border: 0;
        frameborder: 0;
        height: 100%;
        width: 100%;
      }

      #header {
        align-items: center;
        background: white;
        border-bottom: 1px #ccc solid;
        display: flex;
        height: 60px;
        justify-content: space-between;
        position: fixed;
        top: 0;
        width: 100%;
        z-index: 100;
      }

      #header #title {
        font-family: 'Google Sans';
        font-size: large;
        margin: auto 0 auto 20px;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        width: 70%;
      }

      #header #interval {
        margin: auto 25px auto 0;
        font-family: Roboto;
        font-size: small;;
      }

      #footer {
        background: #f0f0f0;
        border-bottom: 1px #ccc solid;
        bottom: 0;
        font-family: Roboto;
        font-size: small;
        padding: 10px 10px;
        position: fixed;
        text-align: center;
        width: 100%;
      }

      #contents {
        padding: 100px 20% 50px 20%;
      }

      @media only screen and (max-device-width: 800px) {
        #header {
          border-bottom-width: 5px;
          height: auto;
          display: block;
        }

        #header #title {
          font-size: 3em;
          margin: auto 0 auto 20px;
          width: 90%;
        }

        #header #interval {
          font-size: 1.5em;
          margin: 10px 0 auto 25px;
        }

        #contents {
          padding: 150px 5% 80px;
        }

        #footer {
          font-size: 2em;
        }
      }

      .dash {
        padding: 0 6px;
      }
    </style></head><body><div id="header"><div id="title">WebPerfWG call - April 9 2020</div><div id="interval"><span></span></div></div><div id="contents"><style type="text/css">ul.lst-kix_518o4qfujj-1{list-style-type:none}ul.lst-kix_518o4qfujj-0{list-style-type:none}.lst-kix_518o4qfujj-1>li:before{content:"\0025cb  "}.lst-kix_518o4qfujj-2>li:before{content:"\0025a0  "}.lst-kix_518o4qfujj-3>li:before{content:"\0025cf  "}.lst-kix_518o4qfujj-5>li:before{content:"\0025a0  "}.lst-kix_518o4qfujj-4>li:before{content:"\0025cb  "}ul.lst-kix_yz1iwwqhsjts-8{list-style-type:none}ul.lst-kix_yz1iwwqhsjts-7{list-style-type:none}ul.lst-kix_yz1iwwqhsjts-4{list-style-type:none}ul.lst-kix_yz1iwwqhsjts-3{list-style-type:none}ul.lst-kix_yz1iwwqhsjts-6{list-style-type:none}ul.lst-kix_yz1iwwqhsjts-5{list-style-type:none}.lst-kix_yz1iwwqhsjts-8>li:before{content:"\0025a0  "}ul.lst-kix_yz1iwwqhsjts-0{list-style-type:none}.lst-kix_os5kbc47ffj6-6>li:before{content:"\0025cf  "}ul.lst-kix_yz1iwwqhsjts-2{list-style-type:none}ul.lst-kix_yz1iwwqhsjts-1{list-style-type:none}.lst-kix_yz1iwwqhsjts-5>li:before{content:"\0025a0  "}.lst-kix_yz1iwwqhsjts-7>li:before{content:"\0025cb  "}.lst-kix_os5kbc47ffj6-7>li:before{content:"\0025cb  "}.lst-kix_518o4qfujj-0>li:before{content:"\0025cf  "}.lst-kix_yz1iwwqhsjts-6>li:before{content:"\0025cf  "}.lst-kix_os5kbc47ffj6-8>li:before{content:"\0025a0  "}.lst-kix_yz1iwwqhsjts-1>li:before{content:"\0025cb  "}.lst-kix_yz1iwwqhsjts-3>li:before{content:"\0025cf  "}.lst-kix_yz1iwwqhsjts-0>li:before{content:"\0025cf  "}.lst-kix_yz1iwwqhsjts-4>li:before{content:"\0025cb  "}.lst-kix_yz1iwwqhsjts-2>li:before{content:"\0025a0  "}.lst-kix_518o4qfujj-7>li:before{content:"\0025cb  "}.lst-kix_518o4qfujj-6>li:before{content:"\0025cf  "}.lst-kix_518o4qfujj-8>li:before{content:"\0025a0  "}ul.lst-kix_os5kbc47ffj6-0{list-style-type:none}ul.lst-kix_os5kbc47ffj6-2{list-style-type:none}ul.lst-kix_os5kbc47ffj6-1{list-style-type:none}ul.lst-kix_os5kbc47ffj6-4{list-style-type:none}ul.lst-kix_os5kbc47ffj6-3{list-style-type:none}ul.lst-kix_os5kbc47ffj6-6{list-style-type:none}ul.lst-kix_os5kbc47ffj6-5{list-style-type:none}.lst-kix_os5kbc47ffj6-5>li:before{content:"\0025a0  "}.lst-kix_os5kbc47ffj6-4>li:before{content:"\0025cb  "}.lst-kix_os5kbc47ffj6-3>li:before{content:"\0025cf  "}li.li-bullet-0:before{margin-left:-18pt;white-space:nowrap;display:inline-block;min-width:18pt}.lst-kix_os5kbc47ffj6-1>li:before{content:"\0025cb  "}.lst-kix_os5kbc47ffj6-0>li:before{content:"\0025cf  "}.lst-kix_os5kbc47ffj6-2>li:before{content:"\0025a0  "}ul.lst-kix_518o4qfujj-7{list-style-type:none}ul.lst-kix_os5kbc47ffj6-8{list-style-type:none}ul.lst-kix_518o4qfujj-6{list-style-type:none}ul.lst-kix_os5kbc47ffj6-7{list-style-type:none}ul.lst-kix_518o4qfujj-8{list-style-type:none}ul.lst-kix_518o4qfujj-3{list-style-type:none}ul.lst-kix_518o4qfujj-2{list-style-type:none}ul.lst-kix_518o4qfujj-5{list-style-type:none}ul.lst-kix_518o4qfujj-4{list-style-type:none}ol{margin:0;padding:0}table td,table th{padding:0}.c2{margin-left:72pt;padding-top:0pt;padding-left:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c11{color:#434343;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:14pt;font-family:"Arial";font-style:normal}.c1{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:11pt;font-family:"Arial";font-style:normal}.c7{color:#000000;font-weight:400;text-decoration:none;vertical-align:baseline;font-size:16pt;font-family:"Arial";font-style:normal}.c9{padding-top:16pt;padding-bottom:4pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c5{padding-top:18pt;padding-bottom:6pt;line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.c4{padding-top:0pt;padding-bottom:0pt;line-height:1.15;orphans:2;widows:2;text-align:left}.c6{text-decoration-skip-ink:none;-webkit-text-decoration-skip:none;color:#1155cc;text-decoration:underline}.c12{background-color:#ffffff;max-width:468pt;padding:72pt 72pt 72pt 72pt}.c8{color:inherit;text-decoration:inherit}.c10{margin-left:36pt;padding-left:0pt}.c3{padding:0;margin:0}.c0{font-weight:700}.title{padding-top:0pt;color:#000000;font-size:26pt;padding-bottom:3pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}.subtitle{padding-top:0pt;color:#666666;font-size:15pt;padding-bottom:16pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}li{color:#000000;font-size:11pt;font-family:"Arial"}p{margin:0;color:#000000;font-size:11pt;font-family:"Arial"}h1{padding-top:20pt;color:#000000;font-size:20pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h2{padding-top:18pt;color:#000000;font-size:16pt;padding-bottom:6pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h3{padding-top:16pt;color:#434343;font-size:14pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h4{padding-top:14pt;color:#666666;font-size:12pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h5{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;orphans:2;widows:2;text-align:left}h6{padding-top:12pt;color:#666666;font-size:11pt;padding-bottom:4pt;font-family:"Arial";line-height:1.15;page-break-after:avoid;font-style:italic;orphans:2;widows:2;text-align:left}</style><div class="c12"><h2 class="c5" id="h.4sr05sxkhgc0"><span class="c7">Participants</span></h2><p class="c4"><span class="c1">Peter Perlepes, Yoav Weiss, Nic Jansma, Nicol&aacute;s Pe&ntilde;a, Michal Mocny, Gilles Dubuc, Steven Bougon, Philippe Le Hegaret, Michelle Vu, Benjamin De Kosnik, </span></p><h2 class="c5" id="h.7e1rj7jjc56d"><span class="c7">Next Meeting</span></h2><p class="c4"><span class="c1">April 23rd - 10am PST</span></p><h2 class="c5" id="h.yaszizjdqjad"><span class="c7">Issues</span></h2><h3 class="c9" id="h.eesyasfzdd1u"><span class="c11">Long Tasks</span></h3><ul class="c3 lst-kix_yz1iwwqhsjts-0 start"><li class="c4 c10 li-bullet-0"><span class="c6"><a class="c8" href="https://www.google.com/url?q=https://github.com/w3c/longtasks/issues/75&amp;sa=D&amp;source=editors&amp;ust=1613234706592000&amp;usg=AOvVaw3qDPNBFVyVr4Ab9ei7qBp-">Top-level browsing context scoping</a></span></li></ul><ul class="c3 lst-kix_yz1iwwqhsjts-1 start"><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Unclear why we’re using a top-level browsing context rather than the document. Is there more discussion to be had?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Not sure. Probably just an update required</span></li><li class="c2 li-bullet-0"><span class="c0">Plh</span><span class="c1"><b></b>: We have similar issues in other specifications, so probably need to change it across the board. If I’ll find others I’ll link them</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: I’ll add a note into Github to look at other ones</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: The issue is that we want to report Long Tasks to all the browsing contexts that share a process. &nbsp;I think that’s what Chrome does now.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Should we define it relative to agents and agent clusters?</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: All documents that share an event loop belong to an agent cluster (and sharing the same process)</span></li><li class="c2 li-bullet-0"><span class="c0">Plh</span><span class="c1"><b></b>: Is this in the HTML spec?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: In ECMA spec</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: The question - should we report long tasks to different documents in the same process?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: If you have multiple top level browsing contexts in the same agent cluster, is it OK to report long tasks from one to another?</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: So the top-level context in a same-origin iframe would share it, where cross-origin frame wouldn’t.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Correct</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: For architectures that have cross-origin documents in the same process, we don’t want to expose right? &nbsp;I think the answer is yes</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: The Long Task itself? </span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: The other concern is that a browsing context can have multiple processes, so we should maybe change that to a document</span></li><li class="c2 li-bullet-0"><span class="c0">Plh</span><span class="c1"><b></b>: An OS process? </span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Yes</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: During navigation a browsing context can hold past and future document</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Should we report every task to every document in the event loop, or should we avoid reporting tasks to some documents?</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Has there been outside security and privacy concerns?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: If we’re changing it, want to know if people have concerns.</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: I would like to see this clarified. How is reporting multiple processes useful?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: More like reporting all LTs in the process. If we have 2 origins in the same process, all LTs are reported to both. When there are concerns about the origin of the LT, it’s declared “unknown”.</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: Multiple origins in a single process, would the reports be restricted to a single origin with CORS?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Not with CORS. There are isolated contexts </span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Concrete example: google.com and Google Docs if they’re sharing the same process, if a LT happens in one it is reported to both, since they can affect each other. &nbsp;We might not be doing this on Android.</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Question, does this only happen if one is embedding the other? &nbsp;Or can it happen if there are two tabs open.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: As long as they’re sharing the same process they would both get notified since one can affect the other. &nbsp;That’s the current way the spec defines it.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Maybe we want to define this in terms of isolated contexts.</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: Where are isolated contexts defined?</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: It’s another proposal, with COOP, COEP, CORP. &nbsp;These all enable us to have browsing context that can upload anything either cross-origin or cross-site. &nbsp;A context cannot load anything that is not explicitly opting-out to being embedded. &nbsp;For example, then we can enabled shared array buffers or other powerful features that otherwise are scary in the context of cross-origin. &nbsp;Should we layer Long Tasks on top of those contexts?</span></li><li class="c2 li-bullet-0"><span class="c0">Philippe</span><span class="c1"><b></b>: Right now TAO is not linked to Long Tasks, would it make sense to use it to gate sharing here?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: TAO is already used heavily so we would probably not want to add it to Long Tasks</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: If we want an opt-in, isolated contexts is a better opt-in</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: I’d like to go with same proposal to change references from “browsing contexts” to “documents”</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Proposal to open a new issue to look at sharing within process and how it would work with site isolation</span></li></ul><ul class="c3 lst-kix_yz1iwwqhsjts-0"><li class="c4 c10 li-bullet-0"><span class="c6"><a class="c8" href="https://www.google.com/url?q=https://github.com/w3c/longtasks/issues/76&amp;sa=D&amp;source=editors&amp;ust=1613234706600000&amp;usg=AOvVaw3FvtUeCNeMozeLY39K7xwQ">Event loop timing reporting seems to ignore reentrancy</a></span></li></ul><ul class="c3 lst-kix_yz1iwwqhsjts-1 start"><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Reentrancy is complicated: if a task wants to do some work, it can pause the task, and later restart it. &nbsp;The time would be inflated. &nbsp;From my perspective, that’s a bug in the HTML spec and it should be defined as separate tasks</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Anne’s example was of a sync XHR.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: They probably “cheat” and do sync XHR asynchronously</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: Is this about JS alert()s?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: I’m not sure I understand the use case. Is it because the work after alert is considered in the same task?</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: Yes</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: That is a problem… so your task length would be inflated if you have an alert.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Might be good to discriminate against alerts</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: If the work is blocked and the process cannot respond to user input, then it’s reasonable to just count it as part of the task length.</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: That seems reasonable. That’s what I’d expect.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: So we can close the issue!</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Thinking towards attribution, should we somehow flag such tasks? And alert and sync XHR are slightly different there. &nbsp;Same issue with prompt()</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: In Terms of attribution, blocking user input gadgets are different from sync XHRs</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: My proposal is to wait until we have the JS sampling profiler and solve use cases and attribution like that, as the alert would be in the call stack.</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: I like that</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span><b></b>: Maybe open issues to remind us that alerts and sync XHR would require special attribution</span></li></ul><ul class="c3 lst-kix_yz1iwwqhsjts-0"><li class="c4 c10 li-bullet-0"><span class="c6"><a class="c8" href="https://www.google.com/url?q=https://github.com/w3c/longtasks/issues/80&amp;sa=D&amp;source=editors&amp;ust=1613234706602000&amp;usg=AOvVaw2xPxqeMJMmWzuek2kGOvIQ">Combination of Paint Timing and long tasks can expose precise Paint Timing</a></span></li></ul><ul class="c3 lst-kix_yz1iwwqhsjts-1 start"><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Ryosuke not here, should we wait?</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Moved between repos</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Chrome doesn’t surface update-the-rendering LTs. I’m not sure we should expose update-the-rendering LTs at all (should be part of Frame Timing). Removing them would solve this issue.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Makes sense if we don’t currently implement it, to remove it</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Should rendering LTs be here versus Frame Timing API? &nbsp;Removing that from this spec would resolve this issue.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Not sure if Frame Timing would be affected by same concern, but in there we could mitigate it by fuzzing the timing a bit</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: Rational from moving from Frame Timing to Long Tasks initially?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Possible misunderstanding thinking it was just a Long Tasks problem before.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Paint Timing as specified exposes a start time for the update-the-render step, and rendering Long Tasks (as specified but not implemented) would expose the end time of that step, which would give a precise time of the render. &nbsp;If we exposed that time as part of frame timing, we could mitigate by fuzzing etc.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Similar to how we mitigate rAF timing</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Another way to mitigate this would be to remove the start point of these tasks.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span><b></b>: Need Ryosuke for discussion on moving the start point. For now we can remove them, and maybe add them later if we’re actually intending to implement.</span></li></ul><h3 class="c9" id="h.c0yp3l8enlg0"><span class="c11">PaintTiming</span></h3><ul class="c3 lst-kix_os5kbc47ffj6-0 start"><li class="c4 c10 li-bullet-0"><span class="c6"><a class="c8" href="https://www.google.com/url?q=https://github.com/w3c/paint-timing/issues/40&amp;sa=D&amp;source=editors&amp;ust=1613234706606000&amp;usg=AOvVaw0ZB7_QQcKB33-LwVZIS8m5">surprising (if not understandable) results for first-paint when `document.visibilityState === 'hidden'`</a></span><span class="c1">&nbsp;- bool flag in PerformanceEntry or PageVisibility ‘buffered flag’?</span></li></ul><ul class="c3 lst-kix_os5kbc47ffj6-1 start"><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Whether or not to fire FCP if page was hidden at any part</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Prefer a more holistic solution that doesn’t require making paint timing special.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Options are: Page Visibility (requires some work), but could see the whole history of vis.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Another option is a boolean flag on the entry that says whether the page was backgrounded before it was created</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: As an analytics provider, the visibility state is a good indicator if we should include the data in our buckets. We had proposals to expose if a metric was affected by the visibility state. Seems preferable to me. Could highlight to the data consumer what the data represents.</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Maybe browsers could indicate if the metric was affected</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Prefers something more concrete. In user-timing, do you care about visibility</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Depends if throttling happens or not</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Having information about the page’s full lifecycle when it comes to visibility would be good. &nbsp;Alternative proposal instead of a boolean on each Performance Entry.</span></li><li class="c2 li-bullet-0"><span class="c0">Gilles</span><span class="c1"><b></b>: That does take additional work to consume. &nbsp;Do we need a boolean on the window saying “was this backgrounded”?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: The boolean won’t always work because perf entries can be async or buffered?</span></li><li class="c2 li-bullet-0"><span class="c0">Gilles</span><span class="c1"><b></b>: Still don’t think that a flag on every entry is the right way to go</span></li><li class="c2 li-bullet-0"><span class="c0">Ben</span><span class="c1"><b></b>: Strongly agree, just use visibility</span></li><li class="c2 li-bullet-0"><span class="c0">Yoav</span><span class="c1"><b></b>: Visibility is currently supported (but may be buggy), but we heard feedback from Facebook for example, because in some cases page is not visible before page runs and turns into visible, but cannot tell those cases start. &nbsp;A boolean wouldn’t be sufficient.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: That’s what I meant with buffered flag for page visibility</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Devs would need to go through the timeline and intersect, but it would provide additional use-cases</span></li><li class="c2 li-bullet-0"><span class="c0">Gilles</span><span class="c1"><b></b>: The question is: what else could we use it for?</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: The boolean in question is “has this ever been hidden?” or “this entry fired while it was hidden”? If it’s the former, the boolean can get weird after e.g. 20 minutes of running. A log of state transitions could be more flexible for those cases</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: SPA apps can observe visibility that way, compared to a boolean entry. User timing &amp; SPAs.</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: How to move forward?</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Are there concerns with Page Visibility, are there concerns in exposing it?</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: Already exposed (from event handler)</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Let’s pick up that discussion next time. Try to solicit more feedback</span></li><li class="c2 li-bullet-0"><span class="c0">Nicol&aacute;s</span><span class="c1"><b></b>: post on public-webperf?</span></li><li class="c2 li-bullet-0"><span class="c0">Nic</span><span class="c1"><b></b>: Yup</span></li></ul></div></div><div id="footer"><span>Published by <a target="_blank" title="Learn more about Google Drive" href="https://docs.google.com/">Google Drive</a></span><span class="dash">–</span><a href="https://docs.google.com/u/2/abuse?id=AKkXjoxhhUeS4FIznaCO3sBw_DPLPnFEwyJvPh0yqpN1ktjFX4kvHN1cKD1KXqp3SEUR2H1gjUZvCBjT69-oTHc:0">Report Abuse</a></div><script type="text/javascript" nonce="">(function(){/*

 Copyright The Closure Library Authors.
 SPDX-License-Identifier: Apache-2.0
*/
var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var b=0;b<a.length;++b){var c=a[b];if(c&&c.Math==Math)return c}throw Error("Cannot find global object");}var ca=ba(this);
function da(a,b){if(b)a:{var c=ca;a=a.split(".");for(var d=0;d<a.length-1;d++){var e=a[d];if(!(e in c))break a;c=c[e]}a=a[a.length-1];d=c[a];b=b(d);b!=d&&null!=b&&aa(c,a,{configurable:!0,writable:!0,value:b})}}var ea="function"==typeof Object.create?Object.create:function(a){function b(){}b.prototype=a;return new b},fa;
if("function"==typeof Object.setPrototypeOf)fa=Object.setPrototypeOf;else{var ha;a:{var ia={a:!0},ja={};try{ja.__proto__=ia;ha=ja.a;break a}catch(a){}ha=!1}fa=ha?function(a,b){a.__proto__=b;if(a.__proto__!==b)throw new TypeError(a+" is not extensible");return a}:null}var ka=fa;
function h(a,b){a.prototype=ea(b.prototype);a.prototype.constructor=a;if(ka)ka(a,b);else for(var c in b)if("prototype"!=c)if(Object.defineProperties){var d=Object.getOwnPropertyDescriptor(b,c);d&&Object.defineProperty(a,c,d)}else a[c]=b[c];a.o=b.prototype}da("Object.is",function(a){return a?a:function(b,c){return b===c?0!==b||1/b===1/c:b!==b&&c!==c}});var l=this||self;function la(){}function ma(a){var b=typeof a;return"object"==b&&null!=a||"function"==b}
function na(a,b){var c=Array.prototype.slice.call(arguments,1);return function(){var d=c.slice();d.push.apply(d,arguments);return a.apply(this,d)}}function oa(a,b){function c(){}c.prototype=b.prototype;a.o=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.B=function(d,e,f){for(var g=Array(arguments.length-2),k=2;k<arguments.length;k++)g[k-2]=arguments[k];return b.prototype[e].apply(d,g)}}function pa(a){return a};var qa=Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b,void 0)}:function(a,b){if("string"===typeof a)return"string"!==typeof b||1!=b.length?-1:a.indexOf(b,0);for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};function ra(a,b,c){for(var d in a)b.call(c,a[d],d,a)};var m;function p(a,b){this.i=a===sa&&b||"";this.j=ta}p.prototype.h=!0;p.prototype.g=function(){return this.i};var ta={},sa={};var ua=String.prototype.trim?function(a){return a.trim()}:function(a){return/^[\s\xa0]*([\s\S]*?)[\s\xa0]*$/.exec(a)[1]},va=/&/g,wa=/</g,xa=/>/g,ya=/"/g,za=/'/g,Aa=/\x00/g,Ba=/[\x00&<>"']/;function Ca(a,b){return a<b?-1:a>b?1:0};function q(a,b){this.i=b===r?a:""}q.prototype.h=!0;q.prototype.g=function(){return this.i.toString()};q.prototype.toString=function(){return this.i.toString()};function u(a){return a instanceof q&&a.constructor===q?a.i:"type_error:SafeUrl"}
var Da=/^(?:audio\/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-matroska|x-wav|wav|webm)|font\/\w+|image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|video\/(?:mpeg|mp4|ogg|webm|quicktime|x-matroska))(?:;\w+=(?:\w+|"[\w;,= ]+"))*$/i,Ea=/^data:(.*);base64,[a-z0-9+\/]+=*$/i,Fa=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;function Ga(a){if(a instanceof q)return a;a="object"==typeof a&&a.h?a.g():String(a);Fa.test(a)||(a="about:invalid#zClosurez");return new q(a,r)}
var r={},Ha=new q("about:invalid#zClosurez",r);var v;a:{var Ia=l.navigator;if(Ia){var Ja=Ia.userAgent;if(Ja){v=Ja;break a}}v=""}function w(a){return-1!=v.indexOf(a)};function x(a,b,c){this.i=c===Ka?a:""}x.prototype.h=!0;x.prototype.g=function(){return this.i.toString()};x.prototype.toString=function(){return this.i.toString()};var Ka={};function La(a,b,c,d){a=a instanceof q?a:Ga(a);b=b||l;c=c instanceof p?c instanceof p&&c.constructor===p&&c.j===ta?c.i:"type_error:Const":c||"";return void 0!==d?b.open(u(a),c,d,void 0):b.open(u(a),c)};function Ma(a){Ma[" "](a);return a}Ma[" "]=la;function y(a,b,c){return Object.prototype.hasOwnProperty.call(a,b)?a[b]:a[b]=c(b)};var Na=w("Opera"),z=w("Trident")||w("MSIE"),Oa=w("Edge"),Pa=Oa||z,Qa=w("Gecko")&&!(-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"))&&!(w("Trident")||w("MSIE"))&&!w("Edge"),Ra=-1!=v.toLowerCase().indexOf("webkit")&&!w("Edge"),Sa=w("Macintosh");function Ta(){var a=l.document;return a?a.documentMode:void 0}var Ua;
a:{var Va="",Wa=function(){var a=v;if(Qa)return/rv:([^\);]+)(\)|;)/.exec(a);if(Oa)return/Edge\/([\d\.]+)/.exec(a);if(z)return/\b(?:MSIE|rv)[: ]([^\);]+)(\)|;)/.exec(a);if(Ra)return/WebKit\/(\S+)/.exec(a);if(Na)return/(?:Version)[ \/]?(\S+)/.exec(a)}();Wa&&(Va=Wa?Wa[1]:"");if(z){var Xa=Ta();if(null!=Xa&&Xa>parseFloat(Va)){Ua=String(Xa);break a}}Ua=Va}var Ya=Ua,Za={},$a;if(l.document&&z){var ab=Ta();$a=ab?ab:parseInt(Ya,10)||void 0}else $a=void 0;var bb=$a;function cb(a){return y(a.prototype,"$$generatedClassName",function(){return"Class$obf_"+{valueOf:function(){return++db}}})}var db=1E3;function A(){}A.prototype.u=function(){return this.j||(Object.defineProperties(this,{j:{value:++eb,enumerable:!1}}),this.j)};A.prototype.toString=function(){var a=B(fb(gb(this.constructor)))+"@";var b=(this.u()>>>0).toString(16);return a+B(b)};function D(){}h(D,A);D.prototype.i=function(a){this.h=a;if(a instanceof Object)try{a.A=this}catch(b){}};function hb(a){a.h instanceof Error&&(Error.captureStackTrace?Error.captureStackTrace(a.h):a.h.stack=Error().stack)}D.prototype.toString=function(){var a=fb(gb(this.constructor)),b=this.l;return null==b?a:B(a)+": "+B(b)};function ib(){}h(ib,D);function jb(){}h(jb,ib);var eb=0;function E(){}h(E,jb);E.prototype.i=function(a){jb.prototype.i.call(this,Object.is(this.g,"__noinit__")?a:this.g)};function kb(){}h(kb,E);function lb(a,b){return"string"==typeof a?a.charCodeAt(b):a.g(b)};function B(a){return null==a?"null":a.toString()}function mb(a){return 65536<=a?B(String.fromCharCode((55296+((a-65536|0)>>10&1023)|0)&65535))+B(String.fromCharCode((56320+((a-65536|0)&1023)|0)&65535)):String.fromCharCode(a&65535)}function nb(a,b){var c=b,d=a.length,e;b=lb(a,(e=c,c=c+1|0,e));var f;if(e=55296<=b&&56319>=b&&c<d)a=f=lb(a,c),e=56320<=a&&57343>=a;var g;e?g=65536+((b&1023)<<10)+(f&1023)|0:g=b;return g};function ob(a,b){this.h=a;this.g=b}h(ob,A);function fb(a){var b=cb(a.h);0!=a.g&&(b="L"+B(b)+";");a=a.g;for(var c="",d=0;d<a;d=d+1|0)c=B(c)+"[";return B(c)+B(b)}ob.prototype.toString=function(){return"class "+B(fb(this))};function gb(a){var b=0;return y(a.prototype,"$$class/"+b,function(){return new ob(a,b)})};function pb(a,b){return null==a?a:b?decodeURI(a):decodeURIComponent(a)};var qb=/^(?:([^:/?#.]+):)?(?:\/\/(?:([^/?#]*)@)?([^/#?]*?)(?::([0-9]+))?(?=[/#?]|$))?([^?#]+)?(?:\?([^#]*))?(?:#([\S\s]*))?$/;function rb(a){a=qb.exec(a);for(var b=[],c=0;7>=c;c=c+1|0)a.length<=c||null==a[c]?b.push(null):b.push(a[c]);return b}
function sb(a,b){var c=a.indexOf(mb(35));c=0>c?a.length:c;a:{var d=0;for(var e=b.length;0<(d=a.indexOf(b,d))&&d<c;){var f=nb(a,d-1|0);if(38==f||63==f){if((d+e|0)>=a.length)break a;f=nb(a,d+e|0);if(61==f||38==f||35==f)break a}d=d+(e+1)|0}d=-1}if(0>d)return null;e=a.indexOf(mb(38),d);if(0>e||e>c)e=c;d=d+(b.length+1)|0;b=Math.min(a.length,d);a=a.substr(b,Math.min(a.length,Math.max(d,e))-b|0);c=" ";for(b=0;0<=(b=c.indexOf("\\",b));)36==c.charCodeAt(b+1|0)?(d=B(c.substr(0,b|0))+"$",e=b=b+1|0,c=d+B(c.substr(e))):
(d=B(c.substr(0,b|0)),e=b=b+1|0,c=d+B(c.substr(e)));a=a.replace(/\+/g,c);return pb(a,!1)};function F(a,b){this.h=b;for(var c=[],d=!0,e=a.length-1;0<=e;e--){var f=a[e]|0;d&&f==b||(c[e]=f,d=!1)}this.g=c}var tb={};function ub(a){return-128<=a&&128>a?y(tb,a,function(b){return new F([b|0],0>b?-1:0)}):new F([a|0],0>a?-1:0)}function G(a){if(isNaN(a)||!isFinite(a))return H;if(0>a)return I(G(-a));for(var b=[],c=1,d=0;a>=c;d++)b[d]=a/c|0,c*=4294967296;return new F(b,0)}var H=ub(0),J=ub(1),vb=ub(16777216);
function K(a){if(-1==a.h)return-K(I(a));for(var b=0,c=1,d=0;d<a.g.length;d++){var e=L(a,d);b+=(0<=e?e:4294967296+e)*c;c*=4294967296}return b}F.prototype.toString=function(a){a=a||10;if(2>a||36<a)throw Error("radix out of range: "+a);if(M(this))return"0";if(-1==this.h)return"-"+I(this).toString(a);for(var b=G(Math.pow(a,6)),c=this,d="";;){var e=wb(c,b).g;c=N(c,O(e,b));var f=((0<c.g.length?c.g[0]:c.h)>>>0).toString(a);c=e;if(M(c))return f+d;for(;6>f.length;)f="0"+f;d=f+d}};
function L(a,b){return 0>b?0:b<a.g.length?a.g[b]:a.h}function M(a){if(0!=a.h)return!1;for(var b=0;b<a.g.length;b++)if(0!=a.g[b])return!1;return!0}function P(a,b){a=N(a,b);return-1==a.h?-1:M(a)?0:1}function I(a){for(var b=a.g.length,c=[],d=0;d<b;d++)c[d]=~a.g[d];return(new F(c,~a.h)).add(J)}F.prototype.abs=function(){return-1==this.h?I(this):this};
F.prototype.add=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0,e=0;e<=b;e++){var f=d+(L(this,e)&65535)+(L(a,e)&65535),g=(f>>>16)+(L(this,e)>>>16)+(L(a,e)>>>16);d=g>>>16;f&=65535;g&=65535;c[e]=g<<16|f}return new F(c,c[c.length-1]&-2147483648?-1:0)};function N(a,b){return a.add(I(b))}
function O(a,b){if(M(a)||M(b))return H;if(-1==a.h)return-1==b.h?O(I(a),I(b)):I(O(I(a),b));if(-1==b.h)return I(O(a,I(b)));if(0>P(a,vb)&&0>P(b,vb))return G(K(a)*K(b));for(var c=a.g.length+b.g.length,d=[],e=0;e<2*c;e++)d[e]=0;for(e=0;e<a.g.length;e++)for(var f=0;f<b.g.length;f++){var g=L(a,e)>>>16,k=L(a,e)&65535,t=L(b,f)>>>16,n=L(b,f)&65535;d[2*e+2*f]+=k*n;Q(d,2*e+2*f);d[2*e+2*f+1]+=g*n;Q(d,2*e+2*f+1);d[2*e+2*f+1]+=k*t;Q(d,2*e+2*f+1);d[2*e+2*f+2]+=g*t;Q(d,2*e+2*f+2)}for(e=0;e<c;e++)d[e]=d[2*e+1]<<16|
d[2*e];for(e=c;e<2*c;e++)d[e]=0;return new F(d,0)}function Q(a,b){for(;(a[b]&65535)!=a[b];)a[b+1]+=a[b]>>>16,a[b]&=65535,b++}function S(a,b){this.g=a;this.h=b}
function wb(a,b){if(M(b))throw Error("division by zero");if(M(a))return new S(H,H);if(-1==a.h)return b=wb(I(a),b),new S(I(b.g),I(b.h));if(-1==b.h)return b=wb(a,I(b)),new S(I(b.g),b.h);if(30<a.g.length){if(-1==a.h||-1==b.h)throw Error("slowDivide_ only works with positive integers.");for(var c=J,d=b;0>=P(d,a);)c=xb(c,1),d=xb(d,1);var e=T(c,1),f=T(d,1);d=T(d,2);for(c=T(c,2);!M(d);){var g=f.add(d);0>=P(g,a)&&(e=e.add(c),f=g);d=T(d,1);c=T(c,1)}b=N(a,O(e,b));return new S(e,b)}for(e=H;0<=P(a,b);){c=Math.max(1,
Math.floor(K(a)/K(b)));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);f=G(c);for(g=O(f,b);-1==g.h||0<P(g,a);)c-=d,f=G(c),g=O(f,b);M(f)&&(f=J);e=e.add(f);a=N(a,g)}return new S(e,a)}F.prototype.and=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)&L(a,d);return new F(c,this.h&a.h)};F.prototype.or=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)|L(a,d);return new F(c,this.h|a.h)};
F.prototype.xor=function(a){for(var b=Math.max(this.g.length,a.g.length),c=[],d=0;d<b;d++)c[d]=L(this,d)^L(a,d);return new F(c,this.h^a.h)};function xb(a,b){var c=b>>5;b%=32;for(var d=a.g.length+c+(0<b?1:0),e=[],f=0;f<d;f++)e[f]=0<b?L(a,f-c)<<b|L(a,f-c-1)>>>32-b:L(a,f-c);return new F(e,a.h)}function T(a,b){var c=b>>5;b%=32;for(var d=a.g.length-c,e=[],f=0;f<d;f++)e[f]=0<b?L(a,f+c)>>>b|L(a,f+c+1)<<32-b:L(a,f+c);return new F(e,a.h)};N(xb(J,32),J);N(xb(J,128),J);function yb(a){a&&"function"==typeof a.v&&a.v()};function U(){this.h=this.h;this.g=this.g}U.prototype.h=!1;U.prototype.v=function(){this.h||(this.h=!0,this.j())};U.prototype.j=function(){if(this.g)for(;this.g.length;)this.g.shift()()};var zb=!z||9<=Number(bb),Ab=!z||9<=Number(bb),Bb=z&&!y(Za,"9",function(){for(var a=0,b=ua(String(Ya)).split("."),c=ua("9").split("."),d=Math.max(b.length,c.length),e=0;0==a&&e<d;e++){var f=b[e]||"",g=c[e]||"";do{f=/(\d*)(\D*)(.*)/.exec(f)||["","","",""];g=/(\d*)(\D*)(.*)/.exec(g)||["","","",""];if(0==f[0].length&&0==g[0].length)break;a=Ca(0==f[1].length?0:parseInt(f[1],10),0==g[1].length?0:parseInt(g[1],10))||Ca(0==f[2].length,0==g[2].length)||Ca(f[2],g[2]);f=f[3];g=g[3]}while(0==a)}return 0<=a}),
Cb=function(){if(!l.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},"passive",{get:function(){a=!0}});try{l.addEventListener("test",la,b),l.removeEventListener("test",la,b)}catch(c){}return a}();function Db(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}Db.prototype.h=function(){this.defaultPrevented=!0};function V(a,b){Db.call(this,a?a.type:"");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key="";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType="";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(Qa){a:{try{Ma(b.nodeName);var e=!0;break a}catch(f){}e=
!1}e||(b=null)}}else"mouseover"==c?b=a.fromElement:"mouseout"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||"";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=
a.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType="string"===typeof a.pointerType?a.pointerType:Eb[a.pointerType]||"";this.state=a.state;this.i=a;a.defaultPrevented&&V.o.h.call(this)}}oa(V,Db);var Fb=[1,4,2],Eb={2:"touch",3:"pen",4:"mouse"};V.prototype.h=function(){V.o.h.call(this);var a=this.i;if(a.preventDefault)a.preventDefault();else if(a.returnValue=!1,Bb)try{if(a.ctrlKey||112<=a.keyCode&&123>=a.keyCode)a.keyCode=-1}catch(b){}};var Gb="closure_listenable_"+(1E6*Math.random()|0);var Hb=0;function Ib(a,b,c,d,e){this.listener=a;this.g=null;this.src=b;this.type=c;this.capture=!!d;this.h=e;this.key=++Hb;this.m=this.s=!1}function Jb(a){a.m=!0;a.listener=null;a.g=null;a.src=null;a.h=null};function Kb(a){this.src=a;this.g={};this.h=0}Kb.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g;a:{for(g=0;g<a.length;++g){var k=a[g];if(!k.m&&k.listener==b&&k.capture==!!d&&k.h==e)break a}g=-1}-1<g?(b=a[g],c||(b.s=!1)):(b=new Ib(b,this.src,f,!!d,e),b.s=c,a.push(b));return b};function Lb(a,b){var c=b.type;if(c in a.g){var d=a.g[c],e=qa(d,b),f;(f=0<=e)&&Array.prototype.splice.call(d,e,1);f&&(Jb(b),0==a.g[c].length&&(delete a.g[c],a.h--))}};var Mb="closure_lm_"+(1E6*Math.random()|0),Nb={},Ob=0;function Pb(a,b,c,d,e){if(d&&d.once)return Qb(a,b,c,d,e);if(Array.isArray(b)){for(var f=0;f<b.length;f++)Pb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!1,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!1,d,e)}
function Sb(a,b,c,d,e,f){if(!b)throw Error("Invalid event type");var g=ma(e)?!!e.capture:!!e,k=Tb(a);k||(a[Mb]=k=new Kb(a));c=k.add(b,c,d,g,f);if(c.g)return c;d=Ub();c.g=d;d.src=a;d.listener=c;if(a.addEventListener)Cb||(e=g),void 0===e&&(e=!1),a.addEventListener(b.toString(),d,e);else if(a.attachEvent)a.attachEvent(Vb(b.toString()),d);else if(a.addListener&&a.removeListener)a.addListener(d);else throw Error("addEventListener and attachEvent are unavailable.");Ob++;return c}
function Ub(){var a=Wb,b=Ab?function(c){return a.call(b.src,b.listener,c)}:function(c){c=a.call(b.src,b.listener,c);if(!c)return c};return b}function Qb(a,b,c,d,e){if(Array.isArray(b)){for(var f=0;f<b.length;f++)Qb(a,b[f],c,d,e);return null}c=Rb(c);return a&&a[Gb]?a.g.add(String(b),c,!0,ma(d)?!!d.capture:!!d,e):Sb(a,b,c,!0,d,e)}
function Xb(a){if("number"!==typeof a&&a&&!a.m){var b=a.src;if(b&&b[Gb])Lb(b.g,a);else{var c=a.type,d=a.g;b.removeEventListener?b.removeEventListener(c,d,a.capture):b.detachEvent?b.detachEvent(Vb(c),d):b.addListener&&b.removeListener&&b.removeListener(d);Ob--;(c=Tb(b))?(Lb(c,a),0==c.h&&(c.src=null,b[Mb]=null)):Jb(a)}}}function Vb(a){return a in Nb?Nb[a]:Nb[a]="on"+a}
function Yb(a,b,c,d){var e=!0;if(a=Tb(a))if(b=a.g[b.toString()])for(b=b.concat(),a=0;a<b.length;a++){var f=b[a];f&&f.capture==c&&!f.m&&(f=Zb(f,d),e=e&&!1!==f)}return e}function Zb(a,b){var c=a.listener,d=a.h||a.src;a.s&&Xb(a);return c.call(d,b)}
function Wb(a,b){if(a.m)return!0;if(!Ab){if(!b)a:{b=["window","event"];for(var c=l,d=0;d<b.length;d++)if(c=c[b[d]],null==c){b=null;break a}b=c}d=b;b=new V(d,this);c=!0;if(!(0>d.keyCode||void 0!=d.returnValue)){a:{var e=!1;if(0==d.keyCode)try{d.keyCode=-1;break a}catch(g){e=!0}if(e||void 0==d.returnValue)d.returnValue=!0}d=[];for(e=b.g;e;e=e.parentNode)d.push(e);a=a.type;for(e=d.length-1;0<=e;e--){b.g=d[e];var f=Yb(d[e],a,!0,b);c=c&&f}for(e=0;e<d.length;e++)b.g=d[e],f=Yb(d[e],a,!1,b),c=c&&f}return c}return Zb(a,
new V(b,this))}function Tb(a){a=a[Mb];return a instanceof Kb?a:null}var $b="__closure_events_fn_"+(1E9*Math.random()>>>0);function Rb(a){if("function"===typeof a)return a;a[$b]||(a[$b]=function(b){return a.handleEvent(b)});return a[$b]};function W(a){U.call(this);this.l=a;this.i={}}oa(W,U);var ac=[];function bc(a){ra(a.i,function(b,c){this.i.hasOwnProperty(c)&&Xb(b)},a);a.i={}}W.prototype.j=function(){W.o.j.call(this);bc(this)};W.prototype.handleEvent=function(){throw Error("EventHandler.handleEvent not implemented");};function cc(a){U.call(this);this.i=a||document.body;this.l=new W(this);a=na(yb,this.l);this.h?a():(this.g||(this.g=[]),this.g.push(a));a=this.l;var b=this.i,c=this.u,d="click";Array.isArray(d)||(d&&(ac[0]=d.toString()),d=ac);for(var e=0;e<d.length;e++){var f=Pb(b,d[e],c||a.handleEvent,!1,a.l||a);if(!f)break;a.i[f.key]=f}}h(cc,U);
cc.prototype.u=function(a){if(!(!(zb?0==a.i.button:"click"==a.type||a.i.button&Fb[0])||Sa&&a.ctrlKey||a.defaultPrevented))for(var b=a.target;b&&b!=this.i;){if(b.tagName&&"a"==b.tagName.toLowerCase()){var c=b.getAttribute("href")||b.getAttributeNS("http://www.w3.org/1999/xlink","href"),d=c;try{var e=rb(c)[3];var f;if(f="www.google.com"===pb(e,!0)){var g=rb(c)[5];f="/url"===pb(g,!0)}if(f){var k=sb(c,"q");d=k?k:sb(c,"url")}}catch(C){a:{var t=C;if(null!=t){var n=t.A;if(null!=n){C=n;break a}}if(t instanceof
TypeError){var R=n=new kb;R.l=B(t);hb(R);n.g="__noinit__";n.g=t;n.i(new TypeError(n));t=n}else R=n=new E,R.l=B(t),hb(R),n.g="__noinit__",n.g=t,n.i(Error(n)),t=n;C=t}if(!(C instanceof ib))throw C.h;}d=null!=d?d:"";if(c!=d){e=void 0;b={target:"_blank",noreferrer:!0};c=window;d instanceof q?f=d:(f="undefined"!=typeof d.href?d.href:String(d),f instanceof q||(f="object"==typeof f&&f.h?f.g():String(f),Fa.test(f)?f=new q(f,r):(f=String(f),f=f.replace(/(%0A|%0D)/g,""),f=(g=f.match(Ea))&&Da.test(g[1])?new q(f,
r):null)),f=f||Ha);d=b.target||d.target;g=[];for(e in b)switch(e){case "width":case "height":case "top":case "left":g.push(e+"="+b[e]);break;case "target":case "noopener":case "noreferrer":break;default:g.push(e+"="+(b[e]?1:0))}e=g.join(",");if((w("iPhone")&&!w("iPod")&&!w("iPad")||w("iPad")||w("iPod"))&&c.navigator&&c.navigator.standalone&&d&&"_self"!=d)e="A",g=document,e=String(e),"application/xhtml+xml"===g.contentType&&(e=e.toLowerCase()),g=e=g.createElement(e),f=f instanceof q?f:Ga(f),g.href=
u(f),e.setAttribute("target",d),b.noreferrer&&e.setAttribute("rel","noreferrer"),b=document.createEvent("MouseEvent"),b.initMouseEvent("click",!0,!0,c,1),e.dispatchEvent(b);else if(b.noreferrer){if(c=La("",c,d,e),b=u(f),c){Pa&&-1!=b.indexOf(";")&&(b="'"+b.replace(/'/g,"%27")+"'");c.opener=null;Ba.test(b)&&(-1!=b.indexOf("&")&&(b=b.replace(va,"&amp;")),-1!=b.indexOf("<")&&(b=b.replace(wa,"&lt;")),-1!=b.indexOf(">")&&(b=b.replace(xa,"&gt;")),-1!=b.indexOf('"')&&(b=b.replace(ya,"&quot;")),-1!=b.indexOf("'")&&
(b=b.replace(za,"&#39;")),-1!=b.indexOf("\x00")&&(b=b.replace(Aa,"&#0;")));b='<meta name="referrer" content="no-referrer"><meta http-equiv="refresh" content="0; url='+b+'">';if(void 0===m)if(d=null,(e=l.trustedTypes)&&e.createPolicy){try{d=e.createPolicy("goog#html",{createHTML:pa,createScript:pa,createScriptURL:pa})}catch(C){l.console&&l.console.error(C.message)}m=d}else m=d;b=(d=m)?d.createHTML(b):b;b=new x(b,null,Ka);(c=c.document)&&c.write&&(c.write(b instanceof x&&b.constructor===x?b.i:"type_error:SafeHtml"),
c.close())}}else(c=La(f,c,d,e))&&b.noopener&&(c.opener=null);a.h();break}}b=b.parentNode}};function dc(a){new cc(a)}var X=["DOCS_installLinkReferrerSanitizer"],Y=l;X[0]in Y||"undefined"==typeof Y.execScript||Y.execScript("var "+X[0]);for(var Z;X.length&&(Z=X.shift());)X.length||void 0===dc?Y[Z]&&Y[Z]!==Object.prototype[Z]?Y=Y[Z]:Y=Y[Z]={}:Y[Z]=dc;}).call(this);
</script><script type="text/javascript" nonce="">DOCS_installLinkReferrerSanitizer();</script></body></html>